/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package mattespill.gui;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.swing.*;
import javax.swing.JLabel;
import javax.swing.JPanel;
import mattespill.Oversikt;
import mattespill.Res;
import mattespill.Status;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;

/**
 *
 * @author Erik
 */
public class GUITetris extends JPanel {

    private Oversikt oversikt;
    GUIStatus status;
    private JPanel panelBgImg;
    private Image bg = new ImageIcon("src/mattespill/gui/images/bakgrunn.png").getImage();
    private Image crocimg = new ImageIcon("src/mattespill/gui/images/croc90open.png").getImage();
    private Icon kylling = new ImageIcon("src/mattespill/gui/images/chicken.png");
    private ImageIcon snakkeboble = new ImageIcon("src/mattespill/gui/images/snakkeboble.png");
    private ImageIcon hintus = new ImageIcon("src/mattespill/gui/images/hintus_tetris.png");

    private JLabel kyllingLabel = new JLabel(kylling);
    private JLabel hintusLabel = new JLabel(hintus);
    private JLabel regnestykke = new JLabel();
    private JLabel snakkeLabel = new JLabel(snakkeboble);
    private JLabel tekst;
    private JLabel tekst2;
    private JLabel tekst3;

    private JButton avslutt = new JButton("X");
    private JButton start = new JButton("START");
    private JTextField tekstboks = new JTextField();


    private AudioStream as = null;
    private InputStream in = null;
    private Thread thr1 = new Thread();

    public GUITetris (Oversikt o, boolean nyttSpill) {
        this.oversikt = o;
        status = new GUIStatus(o);
        status.setBounds(0,0,800,50);
        oversikt.genererRegnestykker();
        setLayout(new BorderLayout());
        setPreferredSize(new Dimension(bg.getWidth(null),bg.getHeight(null)+35));
        addMouseListener(new MusLytter());
        //addMouseMotionListener(new MusLytter());
        panelBgImg = new JPanel() {
            public void paintComponent(Graphics g) {
                g.drawImage(bg,0,0,null);
                g.drawImage(crocimg,300,410,null);
            }
        };
        addKeyListener(new KoyListener());
        snakkeLabel.setBounds(150,0,snakkeboble.getIconWidth(),snakkeboble.getIconHeight());
        avslutt.setBounds(719, 6, 50, 40);
        avslutt.addActionListener(new KnappLytter());
        start.addActionListener(new KnappLytter());
        panelBgImg.setLayout(null);
        tekst = new JLabel(" SKRIV INN RETT SVAR SLIK AT KYLLINGEN IKKE BLIR SPIST");
        tekst3 = new JLabel("                     TRYKK HER FOR Å STARTE");
        tekst2 = new JLabel("          HUSK AT DU KAN TRYKKE PÅ MEG FOR HJELP!");
        tekst.setFont(new Font("Comic Sans MS",Font.BOLD,16));
        tekst2.setFont(new Font("Comic Sans MS",Font.BOLD,16));
        tekst3.setFont(new Font("Comic Sans MS",Font.BOLD,16));
        tekst.setBounds(200,0,snakkeboble.getIconWidth(),snakkeboble.getIconHeight()-82);
        tekst2.setBounds(180,30,snakkeboble.getIconWidth(),snakkeboble.getIconHeight()-82);
        tekst3.setBounds(200,60,snakkeboble.getIconWidth(),snakkeboble.getIconHeight()-82);
        tekstboks.setBounds(550,550,40,20);
        tekstboks.addKeyListener(new KoyListener());
        kyllingLabel.setBounds(300,0,140,140);
        hintusLabel.setBounds(657,200,150,150);
        regnestykke.setBounds(327,42,120,100);
        regnestykke.setForeground(Color.white);
        regnestykke.setFont(new Font("Comic Sans MS",Font.BOLD,22));
        regnestykke.setText(oversikt.getHøyre().getRegnestykke());
        panelBgImg.add(tekst);
        panelBgImg.add(tekst2);
        panelBgImg.add(tekst3);
        panelBgImg.add(hintusLabel);
        panelBgImg.add(snakkeLabel);
        panelBgImg.add(regnestykke);
        panelBgImg.add(kyllingLabel);
        panelBgImg.add(avslutt);
        panelBgImg.add(tekstboks);
        panelBgImg.add(status);
        add(panelBgImg);
        kyllingLabel.setVisible(false);
        regnestykke.setVisible(false);
    }
    private void lukkBoble(){
        snakkeLabel.setVisible(false);
        tekst.setVisible(false);
        tekst2.setVisible(false);
        tekst3.setVisible(false);
    }
    private void snakkeBoble(String teksten, String teksten2,String teksten3){
        snakkeLabel.setVisible(true);
        tekst.setVisible(true);
        tekst2.setVisible(true);
        tekst3.setVisible(true);
        tekst.setText(teksten);
        tekst2.setText(teksten2);
        tekst3.setText(teksten3);
    }
    private void rettSvar(){
        int nivaa = oversikt.getNivaa();
        oversikt.rettSvar(2);
        if(nivaa != oversikt.getNivaa()){
            kyllingLabel.setBounds(300,0,140,140);
            regnestykke.setBounds(327,42,120,100);
            
            if(nivaa < 12){
                thr1.interrupt();
                thr1.stop();
                try{
                    in = new FileInputStream("src/mattespill/gui/sounds/lvlup.wav");
                    as = new AudioStream(in);

                }catch(Exception ej){

                }
                snakkeBoble("             GRATULERER DU GIKK OPP TIL NIVÅ "+oversikt.getNivaa()+" !", "             TRYKK HER ELLER ENTER FOR Å FORTSETTE", "");
                
                kyllingLabel.setVisible(false);
                regnestykke.setVisible(false);
            }else{
                oversikt.genererRegnestykker();
                regnestykke.setText(oversikt.getHøyre().getRegnestykke());
            }
            AudioPlayer.player.start(as); 
            oversikt.giPenger();

        }else{
            try{
                in = new FileInputStream("src/mattespill/gui/sounds/cluck2.wav");
                as = new AudioStream(in);
                AudioPlayer.player.start(as);
                kyllingLabel.setBounds(300,0,140,140);
                regnestykke.setBounds(327,42,120,100);
                oversikt.genererRegnestykker();
                regnestykke.setText(oversikt.getHøyre().getRegnestykke());
            }catch(Exception ej){

            }
        }
             

        
    }

    private void bevegKylling(){
        lukkBoble();
        kyllingLabel.setVisible(true);
        regnestykke.setVisible(true);
        kyllingLabel.setBounds(300,0,140,140);
        regnestykke.setBounds(327,42,120,100);
        crocimg = new ImageIcon("src/mattespill/gui/images/croc90open.png").getImage();
        Runnable r1 = new Runnable() {
              public void run() {
                try {
                  while (kyllingLabel.getLocation().getY() < 380) {
                    double Y = kyllingLabel.getLocation().getY()+3;
                    double YY = regnestykke.getLocation().getY()+3;
                    kyllingLabel.setLocation(300, (int)Y);
                    regnestykke.setLocation(327, (int)YY);
                    
                    if(kyllingLabel.getLocation().getY() > 379 ){
                        kyllingLabel.setVisible(false);
                        regnestykke.setVisible(false);
                        crocimg = new ImageIcon("src/mattespill/gui/images/croc90.png").getImage();
                        repaint();
                        revalidate();
                        if(!oversikt.feilSvar()){
                            try{
                                in = new FileInputStream("src/mattespill/gui/sounds/game-over.wav");
                                as = new AudioStream(in);
                                AudioPlayer.player.start(as);
                                oversikt.nyttSpill();
                                GUIGameOver g = new GUIGameOver(oversikt);
                                JPanel mainPanel = (JPanel)getParent();
                                mainPanel.removeAll();// dette er sub-panelet
                                mainPanel.repaint();
                                mainPanel.add(g);
                                mainPanel.revalidate();
                                g.repaint();
                                thr1.interrupt();
                                thr1.stop();
                            }catch(Exception e){

                            }
                        }else{
                            snakkeBoble("                       DU RAKK IKKE Å SVARE.", "            TRYKK HER ELLER EN TAST FOR Å PRØVE PÅ NYTT!", "");
                            tekstboks.setText(null);
                        }
                        
                    }
                    repaint();
                    revalidate();
                    long test = 0;
                    if(oversikt.getNivaa() > 13){
                        test = 14;
                    }else{
                        test = 8 * (15-oversikt.getNivaa());
                    }
                    Thread.sleep(test);
                 }
                } catch (InterruptedException iex) {}
              }
            };
            thr1 = new Thread(r1);
            thr1.start();
    }
    private class MusLytter implements MouseListener {

        public void mouseClicked(MouseEvent e) {
            if(snakkeLabel.isVisible()){
                if(e.getX() >= snakkeLabel.getLocation().getX() && e.getX() <= snakkeLabel.getLocation().getX()+snakkeLabel.getWidth() ){
                    if(e.getY() >=snakkeLabel.getLocation().getY() && e.getY() <= snakkeLabel.getLocation().getY()+snakkeLabel.getHeight() ){
                        crocimg = new ImageIcon("src/mattespill/gui/images/croc90open.png").getImage();
                        oversikt.genererRegnestykker();
                        regnestykke.setText(oversikt.getHøyre().getRegnestykke());
                        tekstboks.requestFocusInWindow();
                        if(!thr1.isAlive()) {
                            bevegKylling();
                        }
                    }
                }
            }
            if(e.getX() >= hintusLabel.getLocation().getX() && e.getX() <= hintusLabel.getLocation().getX()+hintusLabel.getWidth() ){
                if(e.getY() >=hintusLabel.getLocation().getY() && e.getY() <= hintusLabel.getLocation().getY()+hintusLabel.getHeight() ){
                    if(!snakkeLabel.isVisible()){
                        if(oversikt.trekkPenger()){
                            kyllingLabel.setBounds(300,200,140,140);
                            regnestykke.setBounds(327,242,120,100);
                            status.setPenger(oversikt.getStatus().getPenger());
                            thr1.interrupt();
                            oversikt.genererTetrisHint();
                            snakkeBoble(oversikt.res.tekst1, oversikt.res.tekst2, oversikt.res.tekst3);
                        }else{
                            snakkeBoble("                      DU HAR IKKE MER PENGER!","", "");

                        }
                    }
                }
            }
            
        }

        public void mousePressed(MouseEvent e) {

        }

        public void mouseReleased(MouseEvent e) {
            

        }

        public void mouseEntered(MouseEvent e) {

        }

        public void mouseExited(MouseEvent e) {
        }

    }
    private class KnappLytter implements ActionListener {

        public void actionPerformed(ActionEvent e) {
            JButton  hendelse = (JButton)e.getSource();
            if(hendelse.equals(avslutt)){
                GUIFortsett h = new GUIFortsett(oversikt);
                sendVidere(h);
            }
        }
        private void sendVidere(JPanel j){
            JPanel mainPanel = (JPanel)getParent();
            mainPanel.removeAll(); // dette is the sub-panel
            mainPanel.add(j);
            mainPanel.repaint();
            mainPanel.revalidate();
            j.repaint();
            j.revalidate();
        }
    }
    private class KoyListener implements KeyListener {

        public void keyPressed(KeyEvent e) {
           /* int a = e.getKeyCode();

            if(a == e.VK_ENTER){
                if(snakkeLabel.isVisible()){
                    bevegKylling();
                }else{
                    String tall = tekstboks.getText();
                    tekstboks.setText(null);
                    int tallet = 0;
                    try{
                        tallet = Integer.parseInt(tall);
                        if(oversikt.getHøyre().getResultat() == tallet){
                            rettSvar();
                        }else{
                            feilSvar();
                        }
                    }catch(NumberFormatException ee){

                    }
                }
            }*/
        }
        public void keyTyped(KeyEvent e) {


        }

        public void keyReleased(KeyEvent e) {
            
                if(snakkeLabel.isVisible()){
                    tekstboks.setText(null);
                    oversikt.genererRegnestykker();
                    regnestykke.setText(oversikt.getHøyre().getRegnestykke());
                    if(!thr1.isAlive()) {
                        bevegKylling();
                    }
                }else{
                    if(thr1.isAlive()){
                        String tall = tekstboks.getText();
                        tekstboks.setText(tall);
                        //Integer svar  = oversikt.getHøyre().getResußltat();

                        int tallet = 0;
                        try{
                            tallet = Integer.parseInt(tall);
                            if(oversikt.getHøyre().getResultat() == tallet){
                                rettSvar();
                                tekstboks.setText(null);

                            }else{
                               // feilSvar();
                            }
                        }catch(NumberFormatException ee){


                        }
                    }
                }
                Status temp = oversikt.getStatus();
                status.setPenger(temp.getPenger());
                status.setPoeng(temp.getPoeng());
                status.setLiv(temp.getLiv());
                status.setNivaa(oversikt.getNivaa());
        }
    }

}
